home *** CD-ROM | disk | FTP | other *** search
/ PC Graphics Unleashed / PC Graphics Unleashed.iso / ch01 / oak.asm < prev    next >
Assembly Source File  |  1992-12-07  |  11KB  |  365 lines

  1. ;--------------------------------------------------------------------------
  2. ; This is file OAK.ASM
  3. ;
  4. ; Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
  5. ; Copyright (C) 1992 Csaba Biegl, 820 Stirrup Dr, Nashville, TN 37221
  6. ;
  7. ; This file is distributed under the terms listed in the document
  8. ; "copying.dj", available from DJ Delorie at the address above.
  9. ; A copy of "copying.dj" should accompany this file; if not, a copy
  10. ; should be available from where this file was obtained.  This file
  11. ; may not be distributed without a verbatim copy of "copying.dj".
  12. ;
  13. ; This file is distributed WITHOUT ANY WARRANTY; without even the implied
  14. ; warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15. ;--------------------------------------------------------------------------
  16.  
  17. include grdriver.inc
  18. cseg    segment byte public 'code'
  19.     assume  cs:cseg, ds:cseg, es:cseg, ss:nothing
  20.  
  21.  
  22. ;--------------------------------------------------------------------------
  23. ; DRIVER HEADER
  24. ;  The following entries MUST match the structure and constant
  25. ;  declarations in the file 'grdriver.h' of the GRX graphics library
  26. ;  The mode word should contain the following bitfields:
  27. ;     - the GRD_NEW_DRIVER bit set for any new format driver
  28. ;     - the adapter type field should be specified
  29. ;     - the memory size field should be specified
  30. ;     - the paging mode field should be specified
  31. ;  The mode set routine will OR in the plane bitfield as it will
  32. ;  change when different color number modes are requested.
  33. ;--------------------------------------------------------------------------
  34.  
  35.     dw    offset mode_set_routine
  36.     dw    offset paging_routine
  37. mode_W  dw    GRD_NEW_DRIVER+GRD_VGA+GRD_1024K+GRD_NO_RW
  38. ;
  39. ; The 'def_xx' fields are filled in by go32 from the corresponding
  40. ; fields of the 'GO32' environment variable
  41. ;
  42. def_tw  dw    80        ; text width
  43. def_th  dw    25        ; text height
  44. def_gw  dw    640        ; graphics width
  45. def_gh  dw    480        ; graphics height
  46. def_nc  dw    16        ; graphics colors
  47.     dw    offset driver_init_routine
  48.     dw    offset text_mode_table
  49.     dw    offset graphics_mode_table
  50.  
  51. ;
  52. ; Biggest text and graphics sizes
  53. ;
  54. Max_TW  equ    132
  55. Max_TH  equ    60
  56. Max_GWn equ    800        ; non interlaced!!!
  57. Max_GHn equ    600
  58. Max_GW  equ    1024        ; may be interlaced
  59. Max_GH  equ    768
  60.  
  61.  
  62. ;--------------------------------------------------------------------------
  63. ; TABLE OF SUPPORTED TEXT MODES
  64. ;    - keep sorted by size
  65. ;    - end with an all 0 entry
  66. ;    - BIOS field = 0xff disables it
  67. ;    - fields:
  68. ;        width,  height, colors, BIOS#+  setup_procedure_index*256
  69. ;--------------------------------------------------------------------------
  70. text_mode_table        label word
  71.     dw    80,    25,    2,    007h +  00000h
  72.     dw    40,    25,    16,    001h +  00000h
  73.      dw    80,    25,    16,    003h +  00000h
  74. ;    dw    80,    30,    16,    050h +  00000h
  75. ;     dw    80,    43,    16,    051h +  00000h
  76. ;     dw    80,    60,    16,    052h +  00000h
  77. ;     dw    132,    25,    16,    053h +  00000h
  78. ;     dw    132,    30,    16,    054h +  00000h
  79. ;     dw    132,    43,    16,    055h +  00000h
  80. ;     dw    132,    60,    16,    056h +  00000h
  81.     dw    0,    0,    0,    000h +  00000h
  82.  
  83.  
  84. ;--------------------------------------------------------------------------
  85. ; TABLE OF SUPPORTED GRAPHICS MODES
  86. ;    - keep sorted first by colors then by size
  87. ;    - end with an all 0 entry
  88. ;    - BIOS field = 0xff disables it
  89. ;    - fields:
  90. ;        width,  height, colors, BIOS#+  setup_procedure_index*256
  91. ;--------------------------------------------------------------------------
  92. graphics_mode_table    label word
  93.     dw    320,    200,    16,    00dh +  00000h
  94.     dw    640,    200,    16,    00eh +  00000h
  95.     dw    640,    350,    16,    010h +  00000h
  96.     dw    640,    480,    16,    012h +  00000h
  97.     dw    800,    600,    16,    052h +  00000h
  98.     dw    1024,    768,    16,    056h +  00000h
  99.     dw    320,    200,    256,    013h +  00000h
  100.     dw    640,    480,    256,    053h +  00000h
  101.     dw    800,    600,    256,    054h +  00000h
  102.     dw    1024,    768,    256,    059h +  00000h
  103.         dw      1280,   1024,   16,     058h +  00000h
  104.     dw    0,    0,    0,    000h +  00000h
  105.  
  106.  
  107. ;--------------------------------------------------------------------------
  108. ; TABLE OF SPECIAL SETUP PROCEDURES
  109. ;  You may need such procedures for:
  110. ;     -- reloading fonts on standard EGA or VGA for
  111. ;     higher resolution text modes
  112. ;     -- enable HiColor mode of some Super VGAs
  113. ;     -- Handle the parameter passing conventions of the VESA BIOS
  114. ;     -- put VGA into 256 color plane mode ("MODE X")
  115. ;     -- etc...
  116. ;  There should be one entry in the table for every non-zero
  117. ;  'setup_procedure_index' in the text and graphics mode tables.
  118. ;  The first entry in the table belongs to index 100h, and so on.
  119. ;  The special setup procedure is invoked via a near call.
  120. ;
  121. ;  Entry: DI=address of the mode record from the text or graphics
  122. ;      table to set up.
  123. ;
  124. ;  Exit:  Adapter configured
  125. ;      BX=driver mode word as it should be returned by the mode set
  126. ;         routine. Typically it involves picking up the mode word
  127. ;         from the header and OR-ing in the appropriate bitplane mode
  128. ;         bitfield. (This is not needed for text modes)
  129. ;      AX, CX, DX, SI can be trashed, PRESERVE DI!!!!
  130. ;
  131. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  132. ;--------------------------------------------------------------------------
  133. special_setup_table    label word
  134.     dw    0    ; none here !!
  135.  
  136.  
  137. ;--------------------------------------------------------------------------
  138. ; DRIVER INIT ROUTINE
  139. ;  called once after the driver is loaded
  140. ;  may do one or more of the followings:
  141. ;    - check for proper board type
  142. ;    - check amount of RAM on board, and:
  143. ;    -- update word in header to reflect correct amount
  144. ;    -- disable modes in the tables for which there is not enough RAM
  145. ;    - check for special equipment (HiColor DAC, etc...)
  146. ;
  147. ;  Entry: nothing
  148. ;
  149. ;  Exit:  AX=status:
  150. ;       non-zero: OK,
  151. ;       0: something went wrong (e.g. wrong adapter, etc..)
  152. ;      BX,CX,DX may be trashed
  153. ;
  154. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  155. ;--------------------------------------------------------------------------
  156. driver_init_routine    proc    far
  157.     mov    ax,1
  158.     ret
  159. driver_init_routine    endp
  160.  
  161.  
  162. ;--------------------------------------------------------------------------
  163. ; MODE SET ROUTINE
  164. ;  sets up a text or graphics mode as close as possible to the one
  165. ;  reguested by the user with regard to number of colors and size.
  166. ;
  167. ;  Entry: AX=mode selection
  168. ;     0 = 80x25 text
  169. ;     1 = default text
  170. ;     2 = text CX cols by DX rows
  171. ;     3 = biggest text
  172. ;     4 = 320x200 graphics
  173. ;     5 = default graphics
  174. ;     6 = graphics CX width by DX height
  175. ;     7 = biggest non-interlaced graphics
  176. ;     8 = biggest graphics
  177. ;     9 = graphics BX colors, CX width by DX height
  178. ;
  179. ;  Exit: BX=driver mode flag
  180. ;     CX=width (in pixels or characters)
  181. ;     DX=height
  182. ;
  183. ;  NOTE: This runs in real mode, but don't mess with the segment registers.
  184. ;     YOU SHOULD NOT NEED TO CHANGE THIS ROUTINE AS IT IS PRETTY
  185. ;     MUCH TABLE DRIVEN
  186. ;--------------------------------------------------------------------------
  187. mode_set_routine    proc    far
  188.     push    ds
  189.     push    di
  190.     push    si
  191.     mov    si,cs
  192.     mov    ds,si
  193.     cmp    ax,9
  194.     jbe    DoIt
  195.     jmp    Exit
  196. DoIt:    add    ax,ax
  197.     mov    si,ax
  198.     jmp    WORD PTR mode_set_table[si]
  199. mode_set_table  label    word
  200.     dw    offset mode_0
  201.     dw    offset mode_1
  202.     dw    offset mode_2
  203.     dw    offset mode_3
  204.     dw    offset mode_4
  205.     dw    offset mode_5
  206.     dw    offset mode_6
  207.     dw    offset mode_7
  208.     dw    offset mode_8
  209.     dw    offset mode_9
  210. mode_0: mov    si,offset text_mode_table    ; 80x25 text
  211.     mov    bx,def_nc
  212.     mov    cx,80
  213.     mov    dx,25
  214.     jmp    Lookup
  215. mode_1: mov    si,offset text_mode_table    ; default text
  216.     mov    bx,def_nc
  217.     mov    cx,def_tw
  218.     mov    dx,def_th
  219.     jmp    Lookup
  220. mode_2: mov    si,offset text_mode_table    ; CX*DX text
  221.     mov    bx,def_nc
  222.     jmp    Lookup
  223. mode_3: mov    si,offset text_mode_table    ; biggest text
  224.     mov    bx,def_nc
  225.     mov    cx,Max_TW
  226.     mov    dx,Max_TH
  227.     jmp    Lookup
  228. mode_4: mov    si,offset graphics_mode_table    ; 320x200 graphics
  229.     mov    bx,def_nc
  230.     mov    cx,320
  231.     mov    dx,200
  232.     jmp    Lookup
  233. mode_5: mov    si,offset graphics_mode_table    ; default graphics
  234.     mov    bx,def_nc
  235.     mov    cx,def_gw
  236.     mov    dx,def_gh
  237.     jmp    Lookup
  238. mode_6: mov    si,offset graphics_mode_table    ; CX*DX graphics
  239.     mov    bx,def_nc
  240.     jmp    Lookup
  241. mode_7: mov    si,offset graphics_mode_table    ; biggest non-interlaced gr
  242.     mov    bx,def_nc
  243.     mov    cx,Max_GWn
  244.     mov    dx,Max_GHn
  245.     jmp    Lookup
  246. mode_8: mov    si,offset graphics_mode_table    ; biggest graphics
  247.     mov    bx,def_nc
  248.     mov    cx,Max_GW
  249.     mov    dx,Max_GH
  250.     jmp    Lookup
  251. mode_9: mov    si,offset graphics_mode_table    ; CX*DX graphics w/ BX colors
  252. ;
  253. ; At this point:
  254. ;   SI points to the table to search (text or graphics)
  255. ;   BX has colors
  256. ;   CX has width
  257. ;   DX has height
  258. ;
  259. Lookup: xor    ax,ax                ; last color number seen
  260. Find_C: cmp    [si+4],ax            ; last color number == this?
  261.     je    Same_C
  262.     jb    Prev_C                ; end of table -- use last color
  263.     cmp    BYTE PTR [si+6],0ffh        ; valid entry ?
  264.     je    Prev_C                ; not -- use last color
  265.     mov    ax,[si+4]            ; record color number
  266.     mov    di,si                ; start of entries w/ this color
  267.     cmp    ax,bx                ; enough colors ?
  268.     jae    Find_S
  269. Same_C: add    si,8
  270.     jmp    Find_C
  271. Prev_C: or    ax,ax                ; found any color at all?
  272.     je    Exit
  273. ;
  274. ; At this point:
  275. ;   DI points into the table to the first entry with the desired color
  276. ;      number (either it has enough colors or it is the highest color
  277. ;      number supported by the driver). Additionally, at least the
  278. ;      first (= smallest size) entry for this color is valid (has a
  279. ;      valid BIOS number).
  280. ;   AX has the color number adjusted for the driver
  281. ;   CX has width
  282. ;   DX has height
  283. ;
  284. Find_S: cmp    [di+4],ax            ; still the same color #?
  285.     jne    Prev_S
  286.     cmp    BYTE PTR [di+6],0ffh        ; valid entry ?
  287.     je    Prev_S
  288.     cmp    [di],cx
  289.     jb    Next_S
  290.     cmp    [di+2],dx
  291.     jae    GotIt
  292. Next_S: add    di,8
  293.     jmp    Find_S
  294. Prev_S: sub    di,8
  295. ;
  296. ; At this point:
  297. ;   DI points to the table entry we want to set up
  298. ;
  299. GotIt:  mov    ax,[di+6]            ; BIOS mode number
  300.     or    ah,ah                ; special ?
  301.     je    doBIOS
  302.     mov    al,ah
  303.     xor    ah,ah
  304.     dec    ax
  305.     add    ax,ax
  306.     mov    si,ax
  307.     call    WORD PTR special_setup_table[si]
  308.     jmp    RetVal
  309. doBIOS: int    10h
  310.     mov    bx,GRD_1_PLANE
  311.     cmp    WORD PTR [di+4],2        ; 2 colors ?
  312.     je    doFLAG
  313.     mov    bx,GRD_4_PLANES
  314.     cmp    WORD PTR [di+4],16        ; 16 colors ?
  315.     je    doFLAG
  316.     mov    bx,GRD_8_PLANES
  317.     cmp    WORD PTR [di+4],256        ; 256 colors ?
  318.     je    doFLAG
  319.     mov    bx,GRD_16_PLANES
  320.     cmp    WORD PTR [di+4],32768        ; 32K colors ?
  321.     je    doFLAG
  322.     mov    bx,GRD_PLANE_MASK        ; something is wrong!!
  323. doFLAG: or    bx,mode_W
  324. RetVal: mov    cx,[di]
  325.     mov    dx,[di+2]
  326. Exit:    pop    si
  327.     pop    di
  328.     pop    ds
  329.     ret
  330. mode_set_routine    endp
  331.  
  332.  
  333. ;--------------------------------------------------------------------------
  334. ; PAGING ROUTINE
  335. ;
  336. ;  Entry: AH=read page
  337. ;      AL=write page
  338. ;
  339. ;  Exit: VGA configured.
  340. ;     AX,BX,CX,DX,SI,DI may be trashed
  341. ;
  342. ;  NOTE: This runs in protected mode!  Don't mess with the segment registers!
  343. ;     This code must be relocatable and may not reference any data!
  344. ;--------------------------------------------------------------------------
  345.      assume  ds:nothing, es:nothing
  346.  
  347. paging_routine  proc    far
  348.      and    al,15
  349.      mov    ah,al
  350.      shl    al,1
  351.      shl    al,1
  352.      shl    al,1
  353.      shl    al,1
  354.      or    ah,al      ; or al,ah
  355.      mov    al,11h     ;
  356.      mov    dx,3deh    ; mov dx,3dfh
  357.      out    dx,ax      ; out dx,al
  358.      ret
  359. paging_routine  endp
  360.  
  361.  
  362. cseg    ends
  363.      end
  364.  
  365.